#pragma once
#include "DLL.h"
#include "Datatypes.h"
#include <allegro5/allegro.h>

namespace DarkStorm2D {

	namespace GraphicsCore
	{
		class CFont;
		class CImage;
		class CScreen;
	};
	//!Klas reprezentująca kolor.
	/*!
	 * @todo Dodać operator: przypisać, porównujące, itp
	 */
	class DLLDARKSTORM2D CColor
	{
	protected:
		ALLEGRO_COLOR m_Color;
	public:
		friend class GraphicsCore::CFont;
		friend class GraphicsCore::CImage;
		friend class GraphicsCore::CScreen;
		//! Domyślny konstruktor kolor czarny.
		CColor()
		{
			m_Color = al_map_rgb(0,0,0);
		}

		/*! Konsruktor przypisania.
		 * @param Red Komponent Czerwonego.
		 * @param Green Komponent Zielonego.
		 * @param Blue Komponent Niebieskiego.
		 * @param Alpha Komponent Przeźroczystości.
		 */
		CColor(uchar Red, uchar Green, uchar Blue, uchar Alpha = 255)
		{
			m_Color = al_map_rgba(Red,Green,Blue, Alpha);
		}

		/*! Konstruktor kopiujący
		 * @param OtherColor Kolor który ma być skopiowany do tego.
		 */
		CColor(CColor * OtherColor)
		{
			memcpy(&m_Color,&OtherColor->m_Color,sizeof(ALLEGRO_COLOR));
		}

		~CColor() {}

		/*! Zmienia kolor.
		 * @param Red Komponent Czerwonego.
		 * @param Green Komponent Zielonego.
		 * @param Blue Komponent Niebieskiego. 
		 * @param Alpha Komponent Przeźroczystości.
		 */
		inline void SetColor (uchar Red, uchar Green, uchar Blue, uchar Alpha = 255) 
		{
			m_Color = al_map_rgba(Red,Green,Blue, Alpha);
		}

		//! @param Red Komponent Czerwonego.
		void SetRed(uchar Red) 
		{
			uchar g,b,a;
			al_unmap_rgba(m_Color,NULL,&g,&b,&a);
			m_Color = al_map_rgba(Red,g,b,a);
		}
		//! @param Green Komponent Zielonego.
		void SetGreen(uchar Green)
		{
			uchar r,b,a;
			al_unmap_rgba(m_Color,&r,NULL,&b,&a);
			m_Color = al_map_rgba(r,Green,b,a);
		}
		//! @param Blue Komponent Niebieskiego.
		void SetBlue(uchar Blue)
		{
			uchar r,g,a;
			al_unmap_rgba(m_Color,&r,&g,NULL,&a);
			m_Color = al_map_rgba(r,g,Blue,a);
		}
		//! @param Alpha Komponent Przeźroczystości.
		void SetAlpha(uchar Alpha = 255)
		{
			uchar r,g,b;
			al_unmap_rgba(m_Color,&r,&g,&b,NULL);
			m_Color = al_map_rgba(r,g,b,Alpha);
		}

		//! @return Komponent Czerwonego.
		uchar GetRed() 
		{	uchar tmp;
			al_unmap_rgb(m_Color,&tmp, NULL, NULL);
			return tmp;
		}
		//! @return Komponent Zielonego.
		uchar GetGreen()
		{	uchar tmp;
			al_unmap_rgb(m_Color,NULL, &tmp, NULL);
			return tmp;
		}
		//! @return Komponent Niebieskiego.
		uchar GetBlue()
		{	uchar tmp;
			al_unmap_rgb(m_Color, NULL, NULL, &tmp);
			return tmp;
		}
		//! @return Komponent Przeźroczystości.
		uchar GetAlpha()
		{	uchar tmp;
			al_unmap_rgb(m_Color, NULL, NULL, &tmp);
			return tmp;
		}
};

};
